package com.game.majiang.algorithm.doudizhu;

import java.util.ArrayList;
import java.util.List;

public class GameAI {
	// ����
	static public List<String> ShowCard(List<Card> cself,List<Card> ccur,boolean flag) {
		List<Card> self = new ArrayList<Card>(cself);
		List<Card> cur = new ArrayList<Card>(ccur);
		GameAlgorithm.order(self);
		
		Model model = getModel(self);
		// ���ߵ���
		List<String> list = new ArrayList<String>();
		// �������������
		if (cur.size() == 0) {
			// �е����� (����3�����ɻ��ܴ��ĵ���)��
			if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) {
				list.add(model.a1.get(model.a1.size() - 1));
			}// �ж��ӳ����� (����3�����ɻ�)
			else if (model.a2.size() > (model.a111222.size() * 2 + model.a3
					.size())) {
				list.add(model.a2.get(model.a2.size() - 1));
			}// ��˳�ӳ�˳��
			else if (model.a123.size() > 0) {
				list.add(model.a123.get(model.a123.size() - 1));
			}
			// �зɻ����ɻ�
			else if (model.a111222.size() > 0) 
			{
			    String name[] = model.a111222.get(model.a111222.size() - 1).split(",");
				// ����
			    if (name.length / 3 <= model.a1.size()) {
			    	list.add(model.a111222.get(model.a111222.size() - 1));
			    	for (int i = 0; i < name.length / 3; i++)
			    		list.add(model.a1.get(i));
			    } 
			    else if (name.length / 3 <= model.a2.size())// ��˫
				{
			    	list.add(model.a111222.get(model.a111222.size() - 1));
			    	for (int i = 0; i < name.length / 3; i++)
			    		list.add(model.a2.get(i));
				}
				else
				{
					for(int i=0,len=name.length;i<len;i+=3){
							String s=name[0]+",";
							s+=name[1]+",";
							s+=name[2];
							model.a3.add(s);
					}
					// 3����,�ҷǹؼ�ʱ�̲��ܴ�����2
					if (model.a1.size() > 0) {
						list.add(model.a1.get(model.a1.size() - 1));
					}// 3����
					else if (model.a2.size() > 0) {
						list.add(model.a2.get(model.a2.size() - 1));
					}
					list.add(model.a3.get(model.a3.size() - 1));
				}
			}// ��3���ͳ�3����û�оͳ���3
			else if (model.a3.size() > 0)
			{
				// 3����,�ҷǹؼ�ʱ�̲��ܴ�����2
				if (model.a1.size() > 0) {
					list.add(model.a1.get(model.a1.size() - 1));
				}// 3����
				else if (model.a2.size() > 0) {
					list.add(model.a2.get(model.a2.size() - 1));
				}
				list.add(model.a3.get(model.a3.size() - 1));
			}// ��˫˳��˫˳
			else if (model.a112233.size() > 0) {
				list.add(model.a112233.get(model.a112233.size() - 1));
			}// �зɻ����ɻ�
			else if (model.a111222.size() > 0) {
				String name[] = model.a111222.get(0).split(",");
				// ����
				if (name.length / 3 <= model.a1.size()) {
					list.add(model.a111222.get(model.a111222.size() - 1));
					for (int i = 0; i < name.length / 3; i++)
						list.add(model.a1.get(i));
				} else if (name.length / 3 <= model.a2.size())// ��˫
				{
					list.add(model.a111222.get(model.a111222.size() - 1));
					for (int i = 0; i < name.length / 3; i++)
						list.add(model.a2.get(i));
				}
				else
				{
					
				}
				// ��ը����ը��
			} else if (model.a4.size() > 0) {
				// 4��2,1
				int sizea1 = model.a1.size();
				int sizea2 = model.a2.size();
				if (sizea1 >= 2) {
					list.add(model.a1.get(sizea1 - 1));
					list.add(model.a1.get(sizea1 - 2));
					list.add(model.a4.get(0));
				
				} else if (sizea2 >= 2) {
					list.add(model.a2.get(sizea1 - 1));
					list.add(model.a2.get(sizea1 - 2));
					list.add(model.a4.get(0));
					
				} else {// ֱ��ը
					list.add(model.a4.get(0));
				}
			}
		}// ����Ǹ���
		else {		
			CardType cType=GameAlgorithm.jugdeType(cur);
			//����ǵ���
			if(cType==CardType.c1)
			{
				AI_1(model.a1, cur, list,flag);
			}//����Ƕ���
			else if(cType==CardType.c2)
			{
				AI_1(model.a2, cur, list,flag);
			}//3��
			else if(cType==CardType.c3)
			{
				AI_1(model.a3, cur, list,flag);
			}//ը��
			else if(cType==CardType.c4)
			{
				AI_1(model.a4, cur, list,flag);
			}//�����3��1
			else if(cType==CardType.c31){
				 //ƫ�� �漰������
				//if((role+1)%3==main.dizhuFlag)
				AI_2(model.a3, model.a1, cur, list);
			}//�����3��2
			else if(cType==CardType.c32){
				 //ƫ��
				//if((role+1)%3==main.dizhuFlag)
			    AI_2(model.a3, model.a2, cur, list);
			}//�����4��11
			else if(cType==CardType.c411){
					AI_5(model.a4, model.a1, cur, list);
			}
			//�����4��22
			else if(cType==CardType.c422){
					AI_5(model.a4, model.a2, cur, list);
			}
			//˳��
			else if(cType==CardType.c123){
				AI_3(model.a123, cur, list);
			}
			//˫˳
			else if(cType==CardType.c1122){
				AI_3(model.a112233, cur, list);
			}
			//�ɻ�����
			else if(cType==CardType.c11122234){
				AI_4(model.a111222,model.a1, cur, list);
			}
			//�ɻ�����
			else if(cType==CardType.c1112223344){
				AI_4(model.a111222,model.a2, cur, list);
			}
			//ը��
			if(list.size()==0&&cType!=CardType.c4)
			{
				int len4=model.a4.size();
				if(len4>0)
					list.add(model.a4.get(len4-1));
			}
		}
        List<String> list1 = new  ArrayList<String>();
		// ����
		if (list.size() > 0) {
			for(String str :list)
			{
			 String[] ss =str.split(",");
			 for(String s:ss)
				  list1.add(s);
			}
		} 
		if(cur.size() == 0&&list1.size()==0)
		{
			list1.clear();
		}
		return list1;
	}

	/*
	// ��name���Card�������Modelȡ��
	static public List<Card> getCardByName(List<Card> list, String n) {
		String[] name = n.split(",");
		List<Card> cardsList = new ArrayList<Card>();
		int j = 0;
		for (int i = 0, len = list.size(); i < len; i++) {
			if (j < name.length && list.get(i).name.equals(name[j])) {
				cardsList.add(list.get(i));
				i = 0;
				j++;
			}
		}
		return cardsList;
	}
	*/
	
	//˳��
	static public void AI_3(List<String> model,List<Card> player,List<String> list){
		
		for(int i=0,len=model.size();i<len;i++)
		{
			String []s=model.get(i).split(",");
			if(s.length==player.size()&&getValueInt(model.get(i))>GameCommon.getValue(player.get(0)))
			{
				list.add(model.get(i));
				return;
			}
		}
	}
	
	//�ɻ�������˫
	static public void AI_4(List<String> model1,List<String> model2,List<Card> player,List<String> list){
		//�����ظ���
		player=GameCommon.getOrder2(player);
		int len1=model1.size();
		int len2=model2.size();
		
		if(len1<1 || len2<1)
			return;
		for(int i=0;i<len1;i++){
			String []s=model1.get(i).split(",");
			String []s2=model2.get(0).split(",");
			if((s.length/3<=len2)&&(s.length*(3+s2.length)==player.size())&&getValueInt(model1.get(i))>GameCommon.getValue(player.get(0)))
			{
				list.add(model1.get(i));
				for(int j=1;j<=s.length/3;j++)
					list.add(model2.get(len2-j));
			}
		}
	}
	
	//4��1��2
	static public void AI_5(List<String> model1,List<String> model2,List<Card> player,List<String> list){
		//�����ظ���
		player=GameCommon.getOrder2(player);
		int len1=model1.size();
		int len2=model2.size();
		
		if(len1<1 || len2<2)
			return;
		for(int i=0;i<len1;i++){
			if(getValueInt(model1.get(i))>GameCommon.getValue(player.get(0)))
			{
				list.add(model1.get(i));
				for(int j=1;j<=2;j++)
					list.add(model2.get(len2-j));
			}
		}
	}
	
	//���ƣ����ӣ�3����4��,ͨ��
	/**
	 * @param model
	 * @param player
	 * @param list
	 * @param flag �¼��Ƿ����
	 */
	static public void AI_1(List<String> model,List<Card> player,List<String> list,boolean flag){
		if(flag)
		{
			
			for(int i=0,len=model.size();i<len;i++)
			{
				if(getValueInt(model.get(i))>GameCommon.getValue(player.get(0)))
				{
					list.add(model.get(i));
					break;
				}
			}
		}else {//ƫ��
			
			for(int len=model.size(),i=len-1;i>=0;i--)
			{
				if(getValueInt(model.get(i))>GameCommon.getValue(player.get(0)))
				{
					list.add(model.get(i));
					break;
				}
			}
		}
	}
	
	//3��1,2,4��1,2
	static public void AI_2(List<String> model1,List<String> model2,List<Card> player,List<String> list){
		//model1������,model2�Ǵ���,player����ҳ�����,,list��׼���ص���
		//�����ظ���
		int len1=model1.size();
		int len2=model2.size();
		if(len1 < 1||len2<1)
			return;
		player=GameCommon.getOrder2(player);
		
		for(int i=len1-1;i>=0;i--)
		{	
			if(GameAI.getValueInt(model1.get(i))>GameCommon.getValue(player.get(0)))
			{
				list.add(model1.get(i));
				break;
			}
		} 
		list.add(model2.get(len2-1));
		if(list.size()<2)
			list.clear();
	}
	
	//ͨ��name��ֵ
	static public  int getValueInt(String n){
		String name[]=n.split(",");
		//String s=name[0];
		Card card = new Card(Byte.parseByte(name[0]));
	    int ret = card.getWeight();
		return ret;
	}
	
	
	   //����
	  public static Model getModel(List<Card> list){
				//�ȸ���һ��list
				List<Card> list2=new ArrayList<Card>(list);
				Model model=new Model();
				//------�Ȳ�ը��
				getBoomb(list2, model); //ok
				//------��3��
				getThree(list2, model);
				//��ɻ�
				getPlane(list2, model);
				//------�����
				getTwo(list2, model);
				//������
				getTwoTwo(list2, model);
				//��˳��
				get123(list2, model);
				//��
				getSingle(list2, model);
				return model;
			}
			
			//������
			public static void get123(List<Card> list,Model model){
				List<Card> del=new ArrayList<Card>();//Ҫɾ����Cards
				if(list.size()>0&&(GameCommon.getValue(list.get(0))<7 ||GameCommon.getValue(list.get(list.size()-1))>10))
					return;
				if(list.size()<5)
					return;
				for(int i=0,len=list.size();i<len;i++)
				{
					int k=i;
					for(int j=i;j<len;j++){
						if(GameCommon.getValue(list.get(i))-GameCommon.getValue(list.get(j))==j-i)
						{
							k=j;
						}
					}
					if(k-i>=4)
					{
						String s="";
						for(int j=i;j<k;j++)
						{
							s+=list.get(j).name+",";
							del.add(list.get(j));
						}
						s+=list.get(k).name;
						del.add(list.get(k));
						model.a123.add(s);
						i=k;
					}
				}
				list.removeAll(del);
			}
			
			//��˫˳
			public static void getTwoTwo(List<Card> list,Model model){
				List<String> del=new ArrayList<String>();//Ҫɾ����Cards
				//��model����Ķ�����
				List<String> l=model.a2;
				if(l.size()<3)
					return ;
				Integer s[]=new Integer[l.size()];
				for(int i=0,len=l.size();i<len;i++){
					String []name=l.get(i).split(",");
					s[i]= Integer.parseInt(name[0]);
				}
				//s0,1,2,3,4  13,9,8,7,6
				for(int i=0,len=l.size();i<len;i++){
					if(s[i] == 13) //�ų���2
					  continue;
					int k=i;
					for(int j=i;j<len;j++)
					{
						if(s[i]-s[j]==j-i)
							k=j;
					}
					if(k-i>=2)//k=4 i=1
					{//˵����i��k������
						String ss="";
						for(int j=i;j<k;j++)
						{
							ss+=l.get(j)+",";
							del.add(l.get(j));
						}
						ss+=l.get(k);
						model.a112233.add(ss);
						del.add(l.get(k));
						i=k;
					}
				}
				l.removeAll(del);
			}
			
			//��ɻ�
			public static void getPlane(List<Card> list,Model model){
				List<String> del=new ArrayList<String>();//Ҫɾ����Cards
				//��model�����3����
				List<String> l=model.a3;
				if(l.size()<2)
					return ;
				Integer s[]=new Integer[l.size()];
				for(int i=0,len=l.size();i<len;i++){
					String []name=l.get(i).split(",");
					s[i]= Integer.parseInt(name[0]);
				}
				for(int i=0,len=l.size();i<len;i++){
					int k=i;
					for(int j=i;j<len;j++)
					{
						if(s[i]-s[j]==j-i)
							k=j;
					}
					if(k!=i)
					{//˵����i��k�Ƿɻ�
						String ss="";
						for(int j=i;j<k;j++)
						{
							ss+=l.get(j)+",";
							del.add(l.get(j));
						}
						ss+=l.get(k);
						model.a111222.add(ss);
						del.add(l.get(k));
						i=k;
					}
				}
				l.removeAll(del);
			}
			
			//��ը��
			public static void getBoomb(List<Card> list,Model model){
				List<Card> del=new ArrayList<Card>();//Ҫɾ����Cards
				//��ը
				if(list.size()>=2 &&list.get(0).getHuase().get_value()==5 && list.get(1).getHuase().get_value()==5)
				{
					model.a4.add(list.get(0).name+","+list.get(1).name);
					del.add(list.get(0));
					del.add(list.get(1));
				}
				//�����������ը��զ�Ȳ�
				if(list.get(0).get_value()==5)
				{
					del.add(list.get(0));
					model.a1.add(list.get(0).name);
				}
				list.removeAll(del);
				//һ���ը��
				for(int i=0,len=list.size();i<len;i++){
					if(i+3<len && GameCommon.getValue(list.get(i))==GameCommon.getValue(list.get(i+3)))
					{
						String s=list.get(i).name+",";
						s+=list.get(i+1).name+",";
						s+=list.get(i+2).name+",";
						s+=list.get(i+3).name;
						model.a4.add(s);
						for(int j=i;j<=i+3;j++)
							del.add(list.get(j));
						i=i+3;
					}
				}
				list.removeAll(del);
			}
			
			//��3��
			public static void getThree(List<Card> list,Model model){
				List<Card> del=new ArrayList<Card>();//Ҫɾ����Cards
				//����3����ͬ
				for(int i=0,len=list.size();i<len;i++){
					if(i+2<len&&GameCommon.getValue(list.get(i))==GameCommon.getValue(list.get(i+2)))
					{
						String s=list.get(i).name+",";
						s+=list.get(i+1).name+",";
						s+=list.get(i+2).name;
						model.a3.add(s);
						for(int j=i;j<=i+2;j++)
							del.add(list.get(j));
						i=i+2;
					}
				}
				list.removeAll(del);
			}
			
			//�����
			public static void getTwo(List<Card> list,Model model){
				List<Card> del=new ArrayList<Card>();//Ҫɾ����Cards
				//����2����ͬ
				for(int i=0,len=list.size();i<len;i++){
					if(i+1<len&&GameCommon.getValue(list.get(i))==GameCommon.getValue(list.get(i+1)))
					{
						String s=list.get(i).name+",";
						s+=list.get(i+1).name;
						model.a2.add(s);
						for(int j=i;j<=i+1;j++)
							del.add(list.get(j));
						i=i+1;
					}
				}
				list.removeAll(del);
			}
			
			//����
			public static void getSingle(List<Card> list,Model model){
				List<Card> del=new ArrayList<Card>();//Ҫɾ����Cards
				//1
				for(int i=0,len=list.size();i<len;i++){
						model.a1.add(list.get(i).name);
						del.add(list.get(i));
					}
				list.removeAll(del);
			}
			
			//����Ƶ��Ƿ��ܳ�
			public static int checkCards(List<Card> c,List<Card>[] current){
				//�ҳ���ǰ���������ĸ����Գ���,c�ǵ�ѡ����
				List<Card> currentlist=(current[0].size()>0)?current[0]:current[2];
				CardType cType=GameCommon.jugdeType(c);
				//���������ֱͬ�ӹ���
				if(cType!=CardType.c4&&c.size()!=currentlist.size())
					return 0;
				//�Ƚ��ҵĳ�������
				if(GameCommon.jugdeType(c)!=GameCommon.jugdeType(currentlist))
				{
					
					return 0;
				}
				//�Ƚϳ������Ƿ�Ҫ��
				//��ը��
				if(cType==CardType.c4)
				{
					if(c.size()==2)
						return 1;
					if(currentlist.size()==2)
						return 0;
				}
				//����,����,3��,4ը��
				if(cType==CardType.c1||cType==CardType.c2||cType==CardType.c3||cType==CardType.c4){
					if(GameCommon.getValue(c.get(0))<=GameCommon.getValue(currentlist.get(0)))
					{
						 return 0;
					}else {
						return 1;
					}
				}
				//˳��,���ӣ��ɻ���
				if(cType==CardType.c123||cType==CardType.c1122||cType==CardType.c111222)
				{
					if(GameCommon.getValue(c.get(0))<=GameCommon.getValue(currentlist.get(0)))
						return 0;
					else 
						return 1;
				}
				//���ظ���������
				//3��1,3��2 ,�ɻ�������˫,4��1,2,ֻ��Ƚϵ�һ�����У���һ�޶��� 
				if(cType==CardType.c31||cType==CardType.c32||cType==CardType.c411||cType==CardType.c422
						||cType==CardType.c11122234||cType==CardType.c1112223344){
					List<Card> a1=GameCommon.getOrder2(c); //�ҳ�����
					List<Card> a2=GameCommon.getOrder2(currentlist);//��ǰ�����
					if(GameCommon.getValue(a1.get(0))<GameCommon.getValue(a2.get(0)))
						return 0;
				}
				return 1;
			}
		
			//�����ظ���������
			public static List<Card> getOrder2(List<Card> list){
				List<Card> list2=new ArrayList<Card>(list);
				List<Card> list3=new ArrayList<Card>();
				//List<Integer> list4=new ArrayList<Integer>();
				int len=list2.size();
				int a[]=new int[20];
				for(int i=0;i<20;i++)
					a[i]=0;
				for(int i=0;i<len;i++)
				{
					a[GameCommon.getValue(list2.get(i))]++;
				}
				int max=0;
				for(int i=0;i<20;i++){
					max=0;
					for(int j=19;j>=0;j--){
						if(a[j]>a[max])
							max=j;
					}

					for(int k=0;k<len;k++){
						if(GameCommon.getValue(list2.get(k))==max){
							list3.add(list2.get(k));
						}
					}
					list2.remove(list3);
					a[max]=0;
				}
				return list3;
			}
			
}
